// pages/Calculator/Calculator.js
Page({
    onLoad() {
        wx.setNavigationBarTitle({
            title: '空城机の计算器',
        })
        wx.setNavigationBarColor({
            frontColor: '#ffffff',
            backgroundColor: '#C37D58',
        })
    },
    /**
     * 页面的初始数据
     */
    data: {
        keysdata: [ // type：0 计算符  1 数字
            { name: 'AC', index: '001', type: 0 },
            { name: '+/-', index: '002', type: 0 },
            { name: '%', index: '003', type: 0 },
            { name: '÷', index: '004', type: 0 },
            { name: '7', index: '005', type: 1 },
            { name: '8', index: '006', type: 1 },
            { name: '9', index: '007', type: 1 },
            { name: '×', index: '008', type: 0 },
            { name: '4', index: '009', type: 1 },
            { name: '5', index: '0010', type: 1 },
            { name: '6', index: '0011', type: 1 },
            { name: '-', index: '0012', type: 0 },
            { name: '1', index: '0013', type: 1 },
            { name: '2', index: '0014', type: 1 },
            { name: '3', index: '0015', type: 1 },
            { name: '+', index: '0016', type: 0 },
            { name: '0', index: '0017', type: 1 },
            { name: '.', index: '0018', type: 1 },
            { name: '=', index: '0019', type: 0 },
        ],
        resultNum: '0',  //结果
        calNum1: '',  // 计算前位
        calNum2: '',  // 计算后位    
        calIcon: '',  // 计算符   
        calIconEQ: '',  // = 计算符   
        isCompute: false,  // 是否计算
        lastbtn: 0,  //上一个按钮  0：数字  1：计算符号  2：等于 3：清空 4:正负
    },

    // 键盘点击事件
    keyClick(event) {
        
        var n = event.target.dataset.num;
        
        if (n.type == 1) {
            if (this.data.lastbtn == 1) {
                this.data.resultNum = ''
            }
            if (this.data.resultNum == '0') {
                if(n.name != '.')
                    this.data.resultNum = n.name;
                else 
                this.data.resultNum += n.name;
            } else {
                if( this.data.lastbtn == '2' ) {
                    // 是否等于过
                    if (this.data.calIconEQ) {
                        this.clearScreen();
                    }
                    this.data.resultNum = '';
                }
                this.data.resultNum += n.name;
            }
            
            this.setData({ resultNum: this.data.resultNum })
            this.data.lastbtn = 0;  //更新最新按下按钮
        } else if(n.type == 0){    
            // 判断执行哪个方法
            switch (n.name) {
                case 'AC': this.clearScreen(); break;
                case '+/-': this.isNegative(); break;
                case '%': this.remainder(); break;
                case '÷': this.division(); break;
                case '×': this.multiplication(); break;
                case '-': this.reduce(); break;
                case '+': this.add(); break;
                case '=': this.equalRes(); break;
            }         
        }        
    },
    // 相加
    add () {
        let data = this.data;
        if (data.lastbtn == 1 && data.calIcon == '+') return ;        
        // 上一次数字
        if (data.lastbtn == 0) {
            let res = this.compute(data.calNum1, data.resultNum, '+')
            this.setData({ calNum1: res }) 
            this.setData({ resultNum: res }) 
        }
        // 上一次等于
        if (data.lastbtn == 2 && data.calIconEQ) {
            this.setData({ calNum1: data.resultNum }) 
            this.setData({ calNum2: '' })
            this.setData({ calIconEQ: '' })
        }
        // 如果界面为空
        if (!data.calNum1 && !data.calIcon) {
            this.setData({ calNum1: data.resultNum });
        }
        this.setData({ calIcon: '+' });
        data.lastbtn = 1;  //更新最新按下按钮
    },
    // 清除
    clearScreen () {
        this.setData({ resultNum: '0' });
        this.setData({ calNum1: '' });
        this.setData({ calNum2: '' });
        this.setData({ calIcon: '' });
        this.setData({ calIconEQ: '' });
        this.data.lastbtn = 3;  //更新最新按下按钮
        console.clear()
    },
    // 正负
    isNegative (){
        let data = this.data;
        data.resultNum = parseFloat(data.resultNum);  //数值变字符串
        if (data.resultNum > 0){
            this.setData({ resultNum: -data.resultNum }) 
        } else {
            this.setData({ resultNum: Math.abs(data.resultNum) }) 
        }
        data.lastbtn = 4;  //更新最新按下按钮
    },
    // 余数
    remainder () {
        let data = this.data;
        if (data.lastbtn == 1 && data.calIcon == '%') return ;
        // 上一次数字
        if (data.lastbtn == 0) {
            if (!data.calNum1 && !data.calIcon) {
                this.setData({ calNum1: data.resultNum }) 
            } else {
                let res = this.compute(data.calNum1, data.resultNum, '%')
                this.setData({ calNum1: res }) 
                this.setData({ resultNum: res }) 
            }
        }
        // 上一次等于
        if (data.lastbtn == 2 && data.calIconEQ) {
            this.setData({ calNum1: data.resultNum }) 
            this.setData({ calNum2: '' })
            this.setData({ calIconEQ: '' })
        }
        // 如果界面为空
        if (!data.calNum1 && !data.calIcon) {
            this.setData({ calNum1: data.resultNum });
        }
        this.setData({ calIcon: '%' });
        data.lastbtn = 1;  //更新最新按下按钮
    },
    // 除法
    division () {
        let data = this.data;
        if (data.lastbtn == 1 && data.calIcon == '÷') return ;
        
        if (data.calIconEQ) {
            
        }
        // 上一次数字
        if (data.lastbtn == 0) {
            if (!data.calNum1 && !data.calIcon) {
                this.setData({ calNum1: data.resultNum }) 
            } else {
                let res = this.compute(data.calNum1, data.resultNum, '÷')
                this.setData({ calNum1: res }) 
                this.setData({ resultNum: res }) 
            }
        }
        // 上一次等于
        if (data.lastbtn == 2 && data.calIconEQ) {
            this.setData({ calNum1: data.resultNum }) 
            this.setData({ calNum2: '' })
            this.setData({ calIconEQ: '' })
        }
        // 如果界面为空
        if (!data.calNum1 && !data.calIcon) {
            this.setData({ calNum1: data.resultNum });
        }
        this.setData({ calIcon: '÷' });
        data.lastbtn = 1;  //更新最新按下按钮
    },
    // 乘法
    multiplication () {
        let data = this.data;
        if (data.lastbtn == 1 && data.calIcon == '×') return ;
        // 上一次数字
        if (data.lastbtn == 0) {
            let res = this.compute(data.calNum1, data.resultNum, '×')
            this.setData({ calNum1: res }) 
            this.setData({ resultNum: res }) 
        }
        // 上一次等于
        if (data.lastbtn == 2 && data.calIconEQ) {
            this.setData({ calNum1: data.resultNum }) 
            this.setData({ calNum2: '' })
            this.setData({ calIconEQ: '' })
        }
        // 如果界面为空
        if (!data.calNum1 && !data.calIcon) {
            this.setData({ calNum1: data.resultNum });
        }
        this.setData({ calIcon: '×' });
        data.lastbtn = 1;  //更新最新按下按钮
    },
    // 减法
    reduce() {
        let data = this.data;
        if (data.lastbtn == 1 && data.calIcon == '-') return ;
        // 上一次数字
        if (data.lastbtn == 0) {
            if (!data.calNum1 && !data.calIcon) {
                this.setData({ calNum1: data.resultNum }) 
            } else {
                let res = this.compute(data.calNum1, data.resultNum, '-')
                this.setData({ calNum1: res }) 
                this.setData({ resultNum: res }) 
            }
        }
        // 上一次等于
        if (data.lastbtn == 2 && data.calIconEQ) {
            this.setData({ calNum1: data.resultNum }) 
            this.setData({ calNum2: '' })
            this.setData({ calIconEQ: '' })
        }
        // 如果界面为空
        if (!data.calNum1 && !data.calIcon) {
            this.setData({ calNum1: data.resultNum });
        }
       
        this.setData({ calIcon: '-' });
        data.lastbtn = 1;  //更新最新按下按钮
    },
    // 结果
    equalRes() {
        let data = this.data;
        let res;
        // 判断是否等于过
        if (data.calIconEQ) {
            res = this.compute(data.calNum1, data.calNum2, data.calIcon);
            this.setData({ calNum1: res }) 
            this.setData({ resultNum: this.compute(res, data.calNum2, data.calIcon) }) 
        } else {
            if (data.lastbtn == 2) return ;
            // 判断有没有后一个数
            if (this.data.calNum2) { 

            } else {
                if (data.lastbtn == 3) {
                    this.setData({ calNum1: data.resultNum }) 
                    this.setData({ calIcon: '=' });
                }
                if (data.lastbtn == 0 || data.lastbtn == 4) {
                    if (data.calIcon && data.calIcon != '=') {
                        res = this.compute(data.calNum1, data.resultNum, data.calIcon);
                        this.setData({ calNum2: data.resultNum });
                        this.setData({ calIconEQ: '=' });
                        this.setData({ resultNum: res });
                    } else {
                        this.setData({ calNum1: data.resultNum }) 
                        this.setData({ calIcon: '=' });
                    }
                }
                if (data.lastbtn == 1) {
                    // console.log(data.resultNum)
                    this.setData({ calNum1: data.resultNum })
                    res = this.compute(data.calNum1, data.resultNum, data.calIcon);
                    this.setData({ calNum2: data.resultNum }) 
                    this.setData({ resultNum: res }) 
                    this.setData({ calIconEQ: '=' });
                }
                
            }
        }       
        data.lastbtn = 2;  //更新最新按下按钮
    },
    compute(num1, num2, way) {
        let res = 0;
        switch(way) {
            case '%':
                if (!num1 && num1 != 0) { num1 = '1' }
                if (!num2) { num2 = '1' }
                res = parseFloat(num1) % parseFloat(num2); break;
            case '÷':
                if (!num1) { num1 = '1' }
                if (!num2) { num2 = '1' }
                res = parseFloat(num1) / parseFloat(num2); break;
            case '×': 
                if (!num1) { num1 = '1' }
                if (!num2) { num2 = '1' }
                res = parseFloat(num1) * parseFloat(num2); break;
            case '-': 
                if (!num1) { num1 = '0' }
                if (!num2) { num2 = '0' }
                res = parseInt(num1) - parseInt(num2); break;
            case '+': 
                if (!num1) { num1 = '0' }
                if (!num2) { num2 = '0' }
                res = parseFloat(num1) + parseFloat(num2); break;
        }
        return res;
    }
})